너는 딥러닝, 인공신경망, 이미지 다중분류,
TensorFlow·Keras, 모델 성능평가, 데이터 시각화 및
Python 코딩을 전문적으로 수행하는 데이터 분석가이자
대학 교육 전문가이다.

TensorFlow·Keras에서 제공하는 MNIST 손글씨 숫자 데이터를 이용하여
0부터 9까지의 숫자 이미지를 분류하는
완전연결 심층신경망(DNN) 분석을 수행하여라.

본 실습은 첨부 교재의 기본구조를 유지하면서
데이터 확인, 모델 학습, 실제 Python 실행,
시험성능 평가, 오분류 분석 및 하이퍼파라미터 비교까지 수행한다.

────────────────────────────────────
[가장 중요한 실행 원칙]
────────────────────────────────────

- 딥러닝 개념만 설명하거나 Python 코드만 작성하고 종료하지 마라.
- 반드시 Python 코드를 실제 Python 실행환경에서 실행하여라.
- 실제 실행으로 얻은 수치, 표 및 그래프를 확인한 뒤 해석하여라.
- Accuracy, Loss, 혼동행렬, 클래스별 성능 및 예측결과를
  임의로 만들거나 예시값으로 작성하지 마라.
- 오류가 발생하면 원인을 확인하고 코드를 수정한 뒤 다시 실행하여라.
- 모든 최종 결론은 실제 Python 실행결과를 근거로 작성하여라.
- 훈련자료와 시험자료를 혼합하지 마라.
- 시험자료는 최종평가에만 사용하여라.
- 검증자료를 별도로 구성하여 Epoch와 모델구조를 선택하여라.
- 시험 정확도가 훈련 정확도보다 낮다는 사실만으로
  과적합을 단정하지 마라.
- 과적합은 훈련·검증 Loss와 Accuracy 변화로 판단하여라.
- Keras와 tensorflow.keras를 혼용하지 말고 한 방식으로 통일하여라.
- 난수 seed를 고정하여 재현성을 확보하여라.
- GPU 사용 가능 여부를 확인하되,
  GPU가 없더라도 CPU에서 실행 가능한 코드로 작성하여라.
- 모든 그래프와 분석결과는 실제 실행값만 사용하여라.

────────────────────────────────────
1. 분석 목적
────────────────────────────────────

본 분석의 목적은 다음과 같다.

1. MNIST 손글씨 숫자 이미지의 구조를 이해한다.
2. 28×28 픽셀 이미지를 신경망 입력자료로 변환한다.
3. 픽셀값을 0~1 범위로 정규화한다.
4. 완전연결 신경망으로 0~9 숫자를 분류한다.
5. 입력층, 은닉층, 출력층의 역할을 이해한다.
6. ReLU와 Softmax 활성화 함수의 역할을 이해한다.
7. Epoch와 Batch size가 학습에 미치는 영향을 확인한다.
8. 훈련·검증·시험 정확도와 손실을 비교한다.
9. 혼동행렬과 클래스별 Precision·Recall·F1을 분석한다.
10. 오분류 이미지를 확인하고 오류 원인을 탐색한다.
11. Dropout과 Early Stopping으로 과적합을 완화한다.
12. 기본 DNN과 간단한 CNN의 성능을 비교한다.

────────────────────────────────────
2. 첨부 교재의 기본구조
────────────────────────────────────

첨부 교재의 기본 분석흐름은 다음과 같다.

- MNIST 데이터 불러오기
- 훈련 이미지 60,000개 확인
- 시험 이미지 10,000개 확인
- 이미지 크기 28×28 확인
- 이미지를 784개 입력값으로 변환
- 픽셀값을 0~1 범위로 조정
- 레이블 One-hot Encoding
- Dense 512, ReLU 은닉층
- Dense 10, Softmax 출력층
- RMSprop Optimizer
- Categorical Cross-Entropy Loss
- Epoch 5
- Batch size 128
- 시험 정확도 평가

Python 실습에서는 위 구조를 재현하고,
다음 확장분석을 추가하여라.

- 이미지와 레이블 시각화
- 검증자료 분리
- 학습곡선
- 혼동행렬
- 클래스별 성능
- 오분류 이미지
- 예측확률
- Epoch·Batch size·학습률 비교
- Dropout
- Early Stopping
- DNN과 CNN 비교

────────────────────────────────────
3. 실행환경 점검
────────────────────────────────────

다음을 Python으로 실제 출력하여라.

- Python 버전
- TensorFlow 버전
- Keras 버전
- NumPy 버전
- GPU 사용 가능 여부
- GPU 장치명
- 현재 실행장치

다음 방식으로 import를 통일하여라.

```python
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

다음을 설정하여라.

import random
import numpy as np
import tensorflow as tf

SEED = 42

random.seed(SEED)
np.random.seed(SEED)
tf.random.set_seed(SEED)

가능하면 결정론적 연산을 설정하되,
GPU 환경에 따라 완전히 동일한 결과가 나오지 않을 수 있음을 설명하여라.

────────────────────────────────────
4. MNIST 데이터 불러오기
────────────────────────────────────

다음 코드로 데이터를 불러와라.

from tensorflow.keras.datasets import mnist

(train_images, train_labels), (test_images, test_labels) = mnist.load_data()

다음을 실제 출력하여라.

train_images shape
train_labels shape
test_images shape
test_labels shape
데이터 자료형
픽셀값 최솟값과 최댓값
레이블 고유값
숫자별 훈련 표본 수
숫자별 시험 표본 수

기대구조:

훈련 이미지: 60,000 × 28 × 28
훈련 레이블: 60,000개
시험 이미지: 10,000 × 28 × 28
시험 레이블: 10,000개
클래스: 0부터 9까지 총 10개

실제 실행결과를 기준으로 확인하여라.

────────────────────────────────────
5. 이미지 데이터의 구조 설명
────────────────────────────────────

다음을 설명하여라.

이미지 1장은 28×28 픽셀로 구성된다.
각 픽셀은 밝기값을 가진다.
원본 픽셀값 범위는 0~255이다.
자료형은 일반적으로 uint8이다.
0은 검은색, 255는 흰색에 가까운 값이다.
DNN에서는 28×28 이미지를 784개 숫자로 펼쳐 입력한다.
CNN에서는 28×28의 공간구조를 유지한다.

다음 변환을 시각적으로 설명하여라.

28×28 이미지
→ Flatten
→ 784개 픽셀값
→ Dense 512
→ Dense 10
→ 숫자 0~9 확률

────────────────────────────────────
6. MNIST 이미지 시각화
────────────────────────────────────

다음 그래프를 실제 작성하여라.

훈련 이미지 첫 25개
각 이미지의 실제 레이블
숫자 0~9별 대표 이미지
특정 이미지의 픽셀값 Heatmap
숫자별 표본 수 막대그래프

이미지는 grayscale로 표시하여라.

각 이미지 아래에 실제 레이블을 표시하여라.

다음을 설명하여라.

같은 숫자라도 필기형태가 서로 다름
숫자 간 형태가 유사한 경우가 있음
일부 이미지는 흐리거나 비뚤어져 있음
이런 다양성이 분류난이도를 높임

────────────────────────────────────
7. 훈련·검증·시험자료 구성
────────────────────────────────────

MNIST에서 제공하는 시험자료 10,000개는 최종평가용으로 유지하여라.

훈련자료 60,000개 중 일부를 검증자료로 분리하여라.

기본 설정:

실제 훈련자료: 48,000개
검증자료: 12,000개
시험자료: 10,000개
random_state 또는 seed = 42
클래스 비율 유지

가능하면 stratified split을 사용하여라.

다음을 실제 출력하여라.

훈련자료 수
검증자료 수
시험자료 수
각 자료의 클래스별 분포

시험자료는 모델구조나 Epoch 선택에 사용하지 마라.

────────────────────────────────────
8. 픽셀값 정규화
────────────────────────────────────

원본 이미지 자료형과 픽셀범위를 확인한 후
다음과 같이 변환하여라.

train_images = train_images.astype("float32") / 255.0
valid_images = valid_images.astype("float32") / 255.0
test_images = test_images.astype("float32") / 255.0

다음을 실제 확인하여라.

변환 전 자료형
변환 후 자료형
변환 전 픽셀범위
변환 후 픽셀범위

다음을 설명하여라.

uint8을 float32로 변환한다.
픽셀값을 0~255에서 0~1로 정규화한다.
정규화는 신경망의 학습안정성과 수렴속도를 높일 수 있다.
시험자료에도 동일한 255 나누기 변환을 적용한다.

unit8이 아니라 uint8이 정확한 명칭임을 명시하여라.

────────────────────────────────────
9. 레이블 처리방법 비교
────────────────────────────────────

다음 두 방식을 설명하여라.

[방법 A: 정수 레이블]

레이블:

0, 1, 2, ..., 9

손실함수:

sparse_categorical_crossentropy

[방법 B: One-hot Encoding]

예:

숫자 3
→ [0,0,0,1,0,0,0,0,0,0]

손실함수:

categorical_crossentropy

첨부 교재는 One-hot Encoding을 사용한다.

그러나 기본 Python 실습에서는
코드가 간단한 정수 레이블 방식과
sparse_categorical_crossentropy를 우선 사용하여라.

필요하면 One-hot 방식도 별도로 실행하여
성능이 거의 동일한지 확인하여라.

────────────────────────────────────
10. DNN 기본개념
────────────────────────────────────

다음을 학생 수준에 맞게 설명하여라.

Artificial Neural Network
Deep Neural Network
Input Layer
Hidden Layer
Output Layer
Dense Layer
Neuron
Weight
Bias
Activation Function
ReLU
Softmax
Loss Function
Cross-Entropy
Optimizer
Forward Propagation
Backpropagation
Gradient Descent
Epoch
Batch Size
Learning Rate
Overfitting
Generalization

본 모델과 연결하여 설명하여라.

입력노드: 784개
은닉노드: 512개
출력노드: 10개
ReLU: 음수는 0, 양수는 유지
Softmax: 10개 숫자의 확률합을 1로 변환
Cross-Entropy: 실제 클래스와 예측확률 차이를 계산

────────────────────────────────────
11. Epoch의 정확한 설명
────────────────────────────────────

Epoch는 전체 훈련자료를 한 번 모두 사용하여
학습한 횟수라고 설명하여라.

중요:

Epoch마다 가중치를 처음부터 새로 무작위 생성하는 것이 아니다.
모델은 최초 초기 가중치에서 시작한다.
각 Epoch에서 기존 가중치를 손실이 감소하는 방향으로 계속 갱신한다.
Epoch가 너무 적으면 과소적합될 수 있다.
Epoch가 너무 많으면 과적합될 수 있다.
최적 Epoch는 검증손실을 기준으로 확인한다.

────────────────────────────────────
12. Batch size의 정확한 설명
────────────────────────────────────

Batch size는 가중치를 한 번 갱신할 때 사용하는
훈련자료의 개수라고 설명하여라.

다음을 설명하여라.

작은 Batch:

가중치 업데이트 횟수가 많음
경사 추정이 불안정할 수 있음
메모리 사용량이 적음
일반화에 도움이 될 수 있음

큰 Batch:

업데이트 횟수가 적음
GPU 연산 효율이 높을 수 있음
메모리 사용량이 큼
지나치게 크면 일반화 성능이 낮아질 수 있음

Batch size가 크다고
항상 학습시간이 길어지는 것은 아님을 명시하여라.

────────────────────────────────────
13. Learning rate 설명
────────────────────────────────────

정확한 용어는 다음과 같다.

Learning rate
학습률

learning late라고 쓰지 마라.

학습률은 한 번의 가중치 갱신에서
얼마나 크게 이동할지 결정하는 값이다.

다음을 설명하여라.

너무 작으면 학습이 느림
너무 크면 손실이 진동하거나 발산
적절하면 빠르고 안정적으로 수렴
Optimizer에 따라 학습률 조정방식이 다름

────────────────────────────────────
14. 첨부 교재 기본 DNN 구축
────────────────────────────────────

첨부 교재와 대응되는 기본모형을 구축하여라.

권장 최신 문법:

model = keras.Sequential([
    keras.Input(shape=(28, 28)),
    layers.Flatten(),
    layers.Dense(512, activation="relu"),
    layers.Dense(10, activation="softmax")
])

컴파일:

model.compile(
    optimizer="rmsprop",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"]
)

다음을 출력하여라.

model.summary()
입력 shape
각 층의 출력 shape
층별 파라미터 수
전체 파라미터 수
학습 가능한 파라미터 수

다음을 설명하여라.

Flatten:

28×28 이미지를 784개 값으로 변환
학습 파라미터는 없음

Dense 512:

784개 입력과 512개 뉴런 연결
ReLU 활성화

Dense 10:

숫자 0~9에 대응하는 10개 출력
Softmax 확률 출력

────────────────────────────────────
15. 모델 파라미터 수 계산
────────────────────────────────────

다음 식으로 직접 계산하여라.

Dense 512:

784 × 512 + 512

Dense 10:

512 × 10 + 10

전체 파라미터 수를 계산하고
model.summary() 결과와 일치하는지 확인하여라.

가중치와 Bias를 구분하여 설명하여라.

────────────────────────────────────
16. 기본모형 학습
────────────────────────────────────

첨부 교재 재현을 위해 먼저 다음 설정으로 학습하여라.

Epoch = 5
Batch size = 128
Optimizer = RMSprop
Validation data 사용
history = model.fit(
    x_train,
    y_train,
    epochs=5,
    batch_size=128,
    validation_data=(x_valid, y_valid),
    verbose=1
)

다음을 실제 출력하여라.

Epoch별 Train Loss
Epoch별 Train Accuracy
Epoch별 Validation Loss
Epoch별 Validation Accuracy
학습시간
Epoch당 평균시간

첨부 교재의 과거 실행값을 그대로 사용하지 말고
현재 실행환경의 실제 결과를 사용하여라.

────────────────────────────────────
17. 학습곡선 시각화
────────────────────────────────────

history 객체를 이용하여 다음 그래프를 작성하여라.

Epoch 대 Training Loss
Epoch 대 Validation Loss
Epoch 대 Training Accuracy
Epoch 대 Validation Accuracy

가능하면 Loss와 Accuracy를 각각 별도 그래프로 작성하여라.

다음을 해석하여라.

훈련손실이 감소하는가?
검증손실도 감소하는가?
검증손실이 다시 증가하는 시점이 있는가?
훈련정확도와 검증정확도의 차이는 얼마인가?
과적합 징후가 있는가?
Epoch 5가 적절한가?

훈련정확도가 검증정확도보다 높다는 사실만으로
과적합이라고 단정하지 마라.

────────────────────────────────────
18. 시험자료 최종평가
────────────────────────────────────

시험자료는 모델선정이 끝난 후 한 번 평가하여라.

test_loss, test_accuracy = model.evaluate(
    test_images,
    test_labels,
    verbose=0
)

다음을 출력하여라.

Test Loss
Test Accuracy
Train Accuracy
Validation Accuracy
일반화 차이

다음 값을 계산하여라.

Train Accuracy - Test Accuracy
Validation Accuracy - Test Accuracy

차이가 존재하는 이유를 설명하여라.

────────────────────────────────────
19. 과적합 판단
────────────────────────────────────

다음 기준을 종합하여 판단하여라.

과적합 가능성:

훈련 Loss는 계속 감소
검증 Loss는 증가
훈련 Accuracy는 증가
검증 Accuracy는 정체 또는 감소
Train과 Validation 성능 차이가 지속적으로 확대

단순히 다음 이유만으로 과적합을 확정하지 마라.

Train Accuracy > Test Accuracy

최종적으로 다음 중 하나로 판단하여라.

과적합 징후 없음
약한 과적합 가능성
뚜렷한 과적합
판단을 위해 Epoch 추가실험 필요

판단근거를 실제 학습곡선으로 제시하여라.

────────────────────────────────────
20. 시험자료 예측
────────────────────────────────────

시험자료 전체의 숫자별 예측확률을 계산하여라.

pred_probabilities = model.predict(test_images)
pred_labels = np.argmax(pred_probabilities, axis=1)

다음을 확인하여라.

예측확률 shape
각 행의 확률합이 1인지
예측 클래스
최대 예측확률
실제 클래스
예측 정오 여부

다음 표를 작성하여라.

실제 숫자	예측 숫자	최대확률	정오

시험자료 앞부분 20개를 출력하여라.

────────────────────────────────────
21. 혼동행렬
────────────────────────────────────

시험자료의 혼동행렬을 계산하여라.

행: 실제 숫자
열: 예측 숫자

다음 두 형태로 작성하여라.

개수 기반 혼동행렬
행 기준 비율 혼동행렬

Heatmap 형태로 시각화하여라.

다음을 분석하여라.

가장 정확하게 분류된 숫자
가장 낮은 Recall을 보인 숫자
가장 자주 혼동된 숫자쌍
대칭적 혼동인지
특정 숫자가 다른 숫자로 과도하게 예측되는지

────────────────────────────────────
22. 클래스별 분류성능
────────────────────────────────────

숫자 0~9 각각에 대해 다음을 계산하여라.

Precision
Recall
F1-score
Support

다음 평균도 제시하여라.

Macro Precision
Macro Recall
Macro F1
Weighted Precision
Weighted Recall
Weighted F1

다음 표를 작성하여라.

숫자	Precision	Recall	F1-score	표본 수

Accuracy와 클래스별 성능이 함께 필요한 이유를 설명하여라.

────────────────────────────────────
23. 오분류 이미지 분석
────────────────────────────────────

오분류된 시험 이미지를 추출하여라.

다음 유형별로 이미지를 시각화하여라.

오분류 이미지 25개
실제값과 예측값 표시
최대 예측확률 표시
확률이 높은 오분류 사례
확률이 낮은 불확실한 사례

이미지 제목 예:

Actual: 4
Predicted: 9
Probability: 0.93

다음을 해석하여라.

실제 이미지가 사람이 보기에도 모호한가?
숫자 형태가 유사한가?
필기방향이 비정상적인가?
선이 끊겼거나 붙어 있는가?
특정 숫자쌍에서 반복되는 오류가 있는가?

────────────────────────────────────
24. 가장 자주 혼동되는 숫자쌍
────────────────────────────────────

혼동행렬의 대각선을 제외하고
오분류 빈도가 높은 숫자쌍 상위 10개를 추출하여라.

다음 표를 작성하여라.

순위	실제 숫자	예측 숫자	오분류 수

상위 숫자쌍의 대표 오분류 이미지를 함께 표시하여라.

────────────────────────────────────
25. 예측확률과 불확실성
────────────────────────────────────

각 시험 이미지에서 다음을 계산하여라.

가장 높은 확률
두 번째로 높은 확률
확률차이
예측 엔트로피

다음 유형을 추출하여라.

높은 확률로 정답
낮은 확률로 정답
높은 확률로 오답
낮은 확률로 오답

확률차이가 작거나 엔트로피가 높은 이미지는
모델이 불확실하게 판단한 사례로 해석하여라.

────────────────────────────────────
26. Epoch 수 비교
────────────────────────────────────

다음 Epoch 후보를 동일 조건에서 비교하여라.

1
3
5
10
15
20

각 Epoch에서 다음을 비교하여라.

Train Loss
Validation Loss
Train Accuracy
Validation Accuracy
Test Accuracy
학습시간
과적합 여부

다음 표를 작성하여라.

Epoch	Train Acc	Valid Acc	Test Acc	Valid Loss	과적합

성능이 가장 높은 Epoch뿐 아니라
검증손실이 최소인 Epoch를 확인하여라.

────────────────────────────────────
27. Batch size 비교
────────────────────────────────────

다음 Batch size를 비교하여라.

32
64
128
256
512

각 설정에서 다음을 계산하여라.

Epoch당 Step 수
학습시간
Train Accuracy
Validation Accuracy
Test Accuracy
최종 Loss

동일한 Epoch 수와 모델구조를 사용하여라.

다음 표를 작성하여라.

Batch size	Steps/Epoch	Time	Valid Acc	Test Acc

Batch size에 따른 성능과 속도의 균형을 해석하여라.

────────────────────────────────────
28. Optimizer 비교
────────────────────────────────────

다음 Optimizer를 비교하여라.

SGD
RMSprop
Adam

동일한 모델구조, Epoch, Batch size를 사용하여라.

각 Optimizer에서 다음을 비교하여라.

Train Loss
Validation Loss
Test Accuracy
학습시간
수렴속도

다음 표를 작성하여라.

Optimizer	Valid Loss	Valid Acc	Test Acc	Time

────────────────────────────────────
29. Learning rate 비교
────────────────────────────────────

다음 학습률을 비교하여라.

0.0001
0.001
0.01
0.1

Adam 또는 RMSprop 중 하나를 고정하고 비교하여라.

각 학습률에서 다음을 확인하여라.

손실 감소속도
손실 진동
학습 발산
검증정확도
시험정확도

학습률별 학습곡선을 비교하여라.

────────────────────────────────────
30. 은닉노드 수 비교
────────────────────────────────────

다음 구조를 비교하여라.

Dense 64
Dense 128
Dense 256
Dense 512
Dense 1,024
Dense 512 → Dense 256

각 구조에서 다음을 계산하여라.

전체 파라미터 수
Train Accuracy
Validation Accuracy
Test Accuracy
학습시간
과적합 여부

다음 표를 작성하여라.

구조	파라미터 수	Valid Acc	Test Acc	Time

성능 차이가 작으면 더 단순한 모델을 선택하여라.

────────────────────────────────────
31. Dropout 적용
────────────────────────────────────

기본 DNN에 Dropout을 적용하여라.

후보:

Dropout 0.1
Dropout 0.2
Dropout 0.3
Dropout 0.5

예:

model = keras.Sequential([
    keras.Input(shape=(28, 28)),
    layers.Flatten(),
    layers.Dense(512, activation="relu"),
    layers.Dropout(0.2),
    layers.Dense(10, activation="softmax")
])

기본모형과 다음을 비교하여라.

Train Accuracy
Validation Accuracy
Test Accuracy
일반화 차이
과적합 여부

Dropout이 훈련정확도를 낮추더라도
검증·시험성능이 향상될 수 있음을 설명하여라.

────────────────────────────────────
32. Early Stopping
────────────────────────────────────

다음 Callback을 적용하여라.

early_stopping = keras.callbacks.EarlyStopping(
    monitor="val_loss",
    patience=3,
    restore_best_weights=True
)

최대 Epoch는 30으로 설정하고,
검증손실이 개선되지 않으면 조기종료하여라.

다음을 출력하여라.

실제 학습된 Epoch 수
최적 Epoch
최저 Validation Loss
최종 Test Accuracy

Early Stopping 미적용 모델과 비교하여라.

────────────────────────────────────
33. 학습률 자동조정
────────────────────────────────────

다음 Callback을 적용하여라.

reduce_lr = keras.callbacks.ReduceLROnPlateau(
    monitor="val_loss",
    factor=0.5,
    patience=2,
    min_lr=1e-6
)

다음을 확인하여라.

학습률이 감소한 Epoch
감소 전후 Validation Loss
최종 Test Accuracy

Early Stopping과 함께 적용했을 때 효과를 분석하여라.

────────────────────────────────────
34. 최적 DNN 선정
────────────────────────────────────

다음 후보를 비교하여라.

첨부 교재 기본 DNN
Validation Split 적용 DNN
Dropout DNN
Early Stopping DNN
최적 Batch size DNN
최적 Optimizer DNN
최적 은닉노드 DNN

다음 표를 작성하여라.

모델	Params	Valid Acc	Test Acc	Macro F1	Time

다음을 종합하여 최종 DNN을 선정하여라.

Validation Loss
Validation Accuracy
Test Accuracy
Macro F1
파라미터 수
학습시간
과적합 정도
구조의 단순성

성능 차이가 미미하면
더 단순한 모델을 선택하여라.

────────────────────────────────────
35. 간단한 CNN 구축
────────────────────────────────────

DNN과 비교하기 위한 간단한 CNN을 구축하여라.

예:

cnn_model = keras.Sequential([
    keras.Input(shape=(28, 28, 1)),
    layers.Conv2D(32, kernel_size=3, activation="relu"),
    layers.MaxPooling2D(pool_size=2),
    layers.Conv2D(64, kernel_size=3, activation="relu"),
    layers.MaxPooling2D(pool_size=2),
    layers.Flatten(),
    layers.Dense(64, activation="relu"),
    layers.Dense(10, activation="softmax")
])

컴파일:

cnn_model.compile(
    optimizer="adam",
    loss="sparse_categorical_crossentropy",
    metrics=["accuracy"]
)

CNN 입력을 위해 채널차원을 추가하여라.

x_train_cnn = x_train[..., np.newaxis]

────────────────────────────────────
36. DNN과 CNN 비교
────────────────────────────────────

다음 표를 작성하여라.

항목	DNN	CNN
입력형태	784 벡터	28×28 이미지
공간정보 활용	낮음	높음
파라미터 수		
Test Accuracy		
Macro F1		
학습시간		
해석 난이도		

다음을 설명하여라.

DNN은 이미지를 1차원으로 펼친다.
CNN은 인접 픽셀과 공간구조를 활용한다.
CNN은 선, 모서리, 곡선 등의 특징을 학습한다.
이미지 분류에서는 CNN이 더 적합할 가능성이 높다.
그러나 DNN은 신경망의 기본구조를 이해하기 좋은 입문모형이다.

────────────────────────────────────
37. 새로운 이미지 예측
────────────────────────────────────

시험자료 중 사용자가 지정한 이미지 번호 또는
무작위 이미지에 대해 다음을 제시하여라.

입력 이미지
실제 숫자
예측 숫자
숫자별 예측확률
상위 3개 후보 숫자
예측 확실성

예측확률을 막대그래프로 시각화하여라.

외부 이미지가 제공되는 경우 다음을 수행하여라.

grayscale 변환
28×28 크기 조정
배경과 숫자 색상 확인
픽셀값 정규화
모델 입력shape 변환
예측

외부 이미지의 전처리가 MNIST와 다르면
예측성능이 낮아질 수 있음을 설명하여라.

────────────────────────────────────
38. 분석의 한계
────────────────────────────────────

다음을 실제 결과와 연결하여 설명하여라.

MNIST는 비교적 정제된 데이터임
실제 필기이미지는 배경과 크기가 다를 수 있음
DNN은 이미지 공간정보를 충분히 활용하지 못함
높은 Accuracy만으로 모든 숫자가 잘 분류되는 것은 아님
특정 숫자쌍은 반복적으로 혼동될 수 있음
신경망 결과는 seed와 환경에 따라 조금 달라질 수 있음
시험자료를 반복적으로 확인하면 사실상 검증자료처럼 사용될 수 있음
외부 손글씨에는 별도 전처리와 재학습이 필요할 수 있음
CNN이 이미지분류에 더 적합할 수 있음

────────────────────────────────────
39. 결과파일 저장
────────────────────────────────────

다음 CSV 파일을 생성하여라.

mnist_data_summary.csv
mnist_class_distribution.csv
mnist_basic_training_history.csv
mnist_test_predictions.csv
mnist_confusion_matrix.csv
mnist_classification_report.csv
mnist_misclassified_images.csv
mnist_confusion_pairs.csv
mnist_epoch_comparison.csv
mnist_batch_comparison.csv
mnist_optimizer_comparison.csv
mnist_learning_rate_comparison.csv
mnist_architecture_comparison.csv
mnist_dropout_comparison.csv
mnist_dnn_cnn_comparison.csv
mnist_final_results.csv

다음 Excel 파일을 생성하여라.

mnist_dnn_classification_results.xlsx

Excel Sheet:

Data_Summary
Class_Distribution
Basic_Training_History
Test_Predictions
Confusion_Matrix
Classification_Report
Misclassified_Images
Confusion_Pairs
Epoch_Comparison
Batch_Comparison
Optimizer_Comparison
Learning_Rate
Architecture_Comparison
Dropout_Comparison
DNN_CNN_Comparison
Final_Results

다음 PNG 파일을 생성하여라.

mnist_sample_images.png
mnist_class_distribution.png
mnist_pixel_heatmap.png
mnist_dnn_architecture.png
mnist_loss_curve.png
mnist_accuracy_curve.png
mnist_confusion_matrix.png
mnist_normalized_confusion_matrix.png
mnist_misclassified_images.png
mnist_high_confidence_errors.png
mnist_uncertain_predictions.png
mnist_epoch_comparison.png
mnist_batch_comparison.png
mnist_optimizer_comparison.png
mnist_learning_rate_comparison.png
mnist_architecture_comparison.png
mnist_dropout_comparison.png
mnist_dnn_cnn_comparison.png
mnist_prediction_probabilities.png

저장 후 파일이 실제로 생성되었는지 확인하여라.

────────────────────────────────────
40. 단계별 Python 코딩
────────────────────────────────────

코드는 다음 단계로 구분하여 작성하여라.

[코딩 1단계] 실행환경과 라이브러리 확인
[코딩 2단계] 난수 seed 설정
[코딩 3단계] MNIST 데이터 불러오기
[코딩 4단계] 데이터 구조 확인
[코딩 5단계] 이미지와 레이블 시각화
[코딩 6단계] 훈련·검증·시험자료 구성
[코딩 7단계] 픽셀값 정규화
[코딩 8단계] 레이블 처리방법 설명
[코딩 9단계] DNN 기본개념 설명
[코딩 10단계] 기본 DNN 구축
[코딩 11단계] 모델 구조와 파라미터 확인
[코딩 12단계] 기본모형 학습
[코딩 13단계] 학습 Loss·Accuracy 시각화
[코딩 14단계] 과적합 점검
[코딩 15단계] 시험자료 최종평가
[코딩 16단계] 시험자료 예측확률 계산
[코딩 17단계] 혼동행렬
[코딩 18단계] 클래스별 Precision·Recall·F1
[코딩 19단계] 오분류 이미지
[코딩 20단계] 자주 혼동되는 숫자쌍
[코딩 21단계] 예측 불확실성
[코딩 22단계] Epoch 비교
[코딩 23단계] Batch size 비교
[코딩 24단계] Optimizer 비교
[코딩 25단계] Learning rate 비교
[코딩 26단계] 은닉노드 수 비교
[코딩 27단계] Dropout 적용
[코딩 28단계] Early Stopping
[코딩 29단계] Learning Rate Scheduler
[코딩 30단계] 최적 DNN 선정
[코딩 31단계] 간단한 CNN 구축
[코딩 32단계] DNN과 CNN 비교
[코딩 33단계] 새로운 이미지 예측
[코딩 34단계] 결과 저장

각 단계에서는 반드시 다음 순서를 지켜라.

무엇을 하는 단계인가?
왜 필요한가?
Python 코드
Python 실제 실행결과
결과 해석
다음 단계와의 연결

모든 분석이 끝나면
처음부터 끝까지 한 번에 실행 가능한
전체 통합 Python 코드를 다시 제시하여라.

────────────────────────────────────
41. Python 코드 작성 원칙
────────────────────────────────────

다음 라이브러리를 기본적으로 사용하여라.

tensorflow
keras
numpy
pandas
matplotlib
scikit-learn
scipy
openpyxl

핵심 클래스와 함수:

keras.Sequential
keras.Input
layers.Flatten
layers.Dense
layers.Dropout
layers.Conv2D
layers.MaxPooling2D
EarlyStopping
ReduceLROnPlateau
confusion_matrix
classification_report
precision_recall_fscore_support

주요 코드에는 한국어 주석을 작성하여라.

그래프는 matplotlib 중심으로 작성하여라.

한글 폰트가 없으면 영문 제목을 사용하고,
폰트 문제로 분석을 중단하지 마라.

────────────────────────────────────
42. 오류 발생 시 처리
────────────────────────────────────

다음 오류가 발생하면 오류 메시지만 제시하고 종료하지 마라.

TensorFlow 설치 오류
MNIST 다운로드 오류
GPU 인식 오류
메모리 부족
입력 shape 오류
레이블 shape 오류
Sparse와 One-hot Loss 불일치
픽셀값 자료형 오류
모델 컴파일 오류
학습 중 NaN Loss
학습 발산
predict shape 오류
혼동행렬 오류
저장파일 오류
한글 폰트 오류

다음 대안을 검토하여 수정한 뒤 재실행하여라.

Batch size 감소
모델 크기 축소
Epoch 감소
Learning rate 감소
Sparse label과 Loss 일치
입력 shape 수정
GPU 대신 CPU 실행
데이터 재다운로드

수정한 내용과 이유를 학생이 이해할 수 있도록 설명하여라.

────────────────────────────────────
43. 결과 검증
────────────────────────────────────

최종결과 전에 다음을 확인하여라.

훈련 이미지가 60,000개인가?
시험 이미지가 10,000개인가?
이미지 크기가 28×28인가?
클래스가 0~9의 10개인가?
픽셀값이 0~1 범위인가?
자료형이 float32인가?
시험자료가 모델선정에 사용되지 않았는가?
검증자료가 별도로 존재하는가?
정수 레이블과 sparse loss가 일치하는가?
One-hot 레이블과 categorical loss가 일치하는가?
Softmax 출력노드가 10개인가?
예측확률의 합이 1인가?
혼동행렬의 행은 실제, 열은 예측인가?
Accuracy가 혼동행렬 대각합과 일치하는가?
과적합 판단이 학습곡선에 근거하는가?
오분류 이미지의 실제값과 예측값이 올바른가?
CNN 입력 shape가 28×28×1인가?
저장파일이 실제로 생성되었는가?

문제가 있으면 코드를 수정하고 다시 실행하여라.

────────────────────────────────────
44. 최종 답변 출력 순서
────────────────────────────────────

최종 답변은 반드시 다음 순서로 작성하여라.

① 분석 목적
② 첨부 교재의 기본구조
③ 실행환경 확인
④ MNIST 데이터 구조
⑤ 손글씨 이미지 시각화
⑥ 훈련·검증·시험자료 구성
⑦ 픽셀값 정규화
⑧ 레이블 인코딩 방식
⑨ DNN 기본개념
⑩ Epoch·Batch size·Learning rate
⑪ 기본 DNN 구조
⑫ 모델 파라미터 수
⑬ 기본모형 실제 학습
⑭ Loss·Accuracy 학습곡선
⑮ 과적합 판단
⑯ 시험 Loss와 Accuracy
⑰ 예측확률과 예측숫자
⑱ 혼동행렬
⑲ 클래스별 Precision·Recall·F1
⑳ 오분류 이미지
㉑ 자주 혼동되는 숫자쌍
㉒ 예측 불확실성
㉓ Epoch 비교
㉔ Batch size 비교
㉕ Optimizer 비교
㉖ Learning rate 비교
㉗ 은닉노드와 구조 비교
㉘ Dropout
㉙ Early Stopping
㉚ 최적 DNN 선정
㉛ CNN 구축
㉜ DNN과 CNN 비교
㉝ 새로운 이미지 예측
㉞ 분석의 한계
㉟ 단계별 Python 코드
㊱ Python 실제 실행결과
㊲ 전체 통합 Python 코드
㊳ 생성된 CSV·Excel·PNG 파일

모든 수치, 표, 그래프 및 결론은
실제 Python 실행결과만을 사용하여라.

────────────────────────────────────
[사용자 입력정보]
────────────────────────────────────

[분석 목적 시작]

MNIST 손글씨 숫자 이미지를 이용하여
0부터 9까지의 숫자를 분류하는
완전연결 심층신경망을 구축하고 성능을 평가한다.

[분석 목적 끝]

[데이터 시작]

TensorFlow Keras MNIST 자동 불러오기

[데이터 끝]

[기본 모델 시작]

입력:
28×28 이미지

Flatten:
784개 입력값

은닉층:
Dense 512
activation=relu

출력층:
Dense 10
activation=softmax

Optimizer:
rmsprop

Loss:
sparse_categorical_crossentropy

Epoch:
5

Batch size:
128

Seed:
42

[기본 모델 끝]

[검증자료 시작]

훈련자료의 20%
클래스 비율 유지

[검증자료 끝]

[비교 Epoch 시작]

1, 3, 5, 10, 15, 20

[비교 Epoch 끝]

[비교 Batch size 시작]

32, 64, 128, 256, 512

[비교 Batch size 끝]

[비교 Optimizer 시작]

SGD, RMSprop, Adam

[비교 Optimizer 끝]

[비교 Learning rate 시작]

0.0001, 0.001, 0.01, 0.1

[비교 Learning rate 끝]

[비교 DNN 구조 시작]

Dense 64
Dense 128
Dense 256
Dense 512
Dense 1024
Dense 512 → Dense 256

[비교 DNN 구조 끝]

[Dropout 시작]

0.1, 0.2, 0.3, 0.5

[Dropout 끝]

[Early Stopping 시작]

monitor=val_loss
patience=3
restore_best_weights=True

[Early Stopping 끝]

[CNN 비교 시작]

Conv2D 32
MaxPooling2D
Conv2D 64
MaxPooling2D
Dense 64
Dense 10 Softmax

[CNN 비교 끝]

[평가지표 시작]

Test Loss
Accuracy
Macro Precision
Macro Recall
Macro F1
클래스별 Precision
클래스별 Recall
클래스별 F1

[평가지표 끝]